package cn.oracle.eshop.Inventory.command;

import cn.oracle.eshop.Inventory.constant.StockStatus;
import cn.oracle.eshop.Inventory.dao.GoodsStockDAO;
import cn.oracle.eshop.Inventory.domain.GoodsStockDO;
import cn.oracle.eshop.comment.util.DateProvider;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/** 库存更新命令工厂的父类
 * @author wyh
 * @ClassName AbstractGoodsStockUpdateCommandFactory
 * @date 2022/3/30 /22:03
 */
@Slf4j
public abstract class AbstractGoodsStockUpdateCommandFactory<T>  implements GoodsStockUpdateCommandFactory<T> {
    /**商品库存管理模块的DAO组件*/
    protected GoodsStockDAO goodsStockDAO;

    /**
     * 日期辅助组件
     */
    protected DateProvider dateProvider;
    /**
     * 构造函数
     * @param goodsStockDAO 商品库存管理模块的DAO组件
     * @param dateProvider 日期辅助组件
     */
    public AbstractGoodsStockUpdateCommandFactory(
            GoodsStockDAO goodsStockDAO,
            DateProvider dateProvider) {
        this.goodsStockDAO = goodsStockDAO;
        this.dateProvider = dateProvider;
    }
    /**
     * 创建库存更新命令
     */
    @Override
    public GoodStockUpdateCommand create(T parameter) {
        try {
            List<Long> goodsSkuIds = getGoodsSkuIds(parameter);
            List<GoodsStockDO> goodsStockDOs = createGoodsStockDOs(goodsSkuIds);
            return create(goodsStockDOs, parameter);
        } catch (Exception e) {
            log.error("error:{}", e);
        }
        return null;
    }
    /**
     * 创建商品库存DO对象集合
     * @param goodsSkuIds 商品sku id集合
     * @return 商品库存DO对象集合
     */
    private List<GoodsStockDO> createGoodsStockDOs(List<Long> goodsSkuIds) throws Exception {
        List<GoodsStockDO> goodsStockDOs = new ArrayList<GoodsStockDO>(goodsSkuIds.size());

        for(Long goodsSkuId : goodsSkuIds) {
            GoodsStockDO goodsStockDO = goodsStockDAO.getGoodsStockBySkuId(goodsSkuId);

            if(goodsStockDO == null) {
                goodsStockDO = new GoodsStockDO();
                goodsStockDO.setGoodSkuId(goodsSkuId);
                goodsStockDO.setSaleStockQuantity(0L);
                goodsStockDO.setLockedStockQuantity(0L);
                goodsStockDO.setSaledStockQuantity(0L);
                goodsStockDO.setStockStatus(StockStatus.NOT_IN_STOCK);
                goodsStockDO.setGmtCreate(dateProvider.getCurrentTime());
                goodsStockDO.setGmtModified(dateProvider.getCurrentTime());

                goodsStockDAO.saveGoodsStock(goodsStockDO);
            }

            goodsStockDOs.add(goodsStockDO);
        }

        return goodsStockDOs;
    }
     /**
     * 创建库存更新命令
     * @param goodsStockDOs 商品库存DO对象集合
     * @return 库存更新命令
     * @throws Exception
     */
    protected abstract GoodStockUpdateCommand create(
            List<GoodsStockDO> goodsStockDOs, T parameter) throws Exception;
    /**
     * 获取商品sku id集合
     * @return 商品sku id集合
     * @throws Exception
     */
    protected abstract List<Long> getGoodsSkuIds(T parameter) throws Exception;
}
